import Koa from 'koa'
import bodyParser from 'koa-bodyparser'
import views from 'koa-views'
import send from 'koa-send'
import session from 'koa-session'
// 1. 导入 connectDb 函数
import { connectDb } from './db/index.js'
import pageRouter from './router/pageRouter.js'
import userRouter from './router/userRouter.js'
import blogRouter from './router/blogRouter.js'

// 2. 调用 connectDb 函数，连接 MongoDB 数据库
await connectDb()
const app = new Koa()

// 设置秘钥（用于加密签名）
app.keys = ['escook']

// 配置 session 选项
const CONFIG = {
  maxAge: 86400000, // 有效期，单位 ms（默认为 1 天）
  httpOnly: true, // 是否只允许服务器访问 Cookie
  signed: true // 是否对 Cookie 进行签名
}

// session 中间件
app.use(session(CONFIG, app))

// 自定义中间件
app.use(async (ctx, next) => {
  // API 接口调用成功时，用于响应成功的结果
  ctx.cc = (data, message = 'success') => {
    ctx.body = { code: 0, message, data }
  }
  // API 接口调用失败时，用于响应失败的结果
  ctx.rr = (message = 'error') => {
    ctx.body = { code: 1, message }
  }
  // 继续调用后续中间件
  await next()
})

// 模板引擎
const render = views(import.meta.dirname, { map: { html: 'ejs' } })
app.use(render)

// 解析请求体
app.use(bodyParser())

// 路由中间件
app.use(pageRouter.routes()).use(pageRouter.allowedMethods())
app.use(userRouter.routes()).use(userRouter.allowedMethods())
app.use(blogRouter.routes()).use(blogRouter.allowedMethods())

// 静态资源托管
app.use(async (ctx) => {
  await send(ctx, ctx.path, { root: import.meta.dirname + '/views' })
})

// 启动服务器，使其运行在 3010 端口
app.listen(3010, () => {
  console.log('Koa blog server running at http://127.0.0.1:3010')
})
